Optimize method_missing via alias_method
#600
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
jbuilderprovides a nice DSL where something likeis simply sugar for the
set!APIThe sugar doesn't come for free, though;
set!performs substantially better in both CPU and memory. Consider the following benchmark:It's around 1.5x slower to use the DSL over
set!! The main culprit for this is the overhead inherent inmethod_missing. The DSL also results in an additional memory allocation to allocate for*args, which is just passed off to set. This is something that adds up for larger responses.What this PR does is simply defines
method_missingas an alias toset!. This saves on some busy work that existed in the method originally (ex: it was doing a::Kernel.block_given?check, even thoughset!already does this.). It also saves on the memory allocation for*args.The before after comparison for the
method_missingimplementationFinal comparison between
method_missingandset!This gets the DSL to be nearly on par with a regular
set!call.